package com.example.pt.task;

import com.example.pt.entity.User;
import com.example.pt.entity.UserLevel;
import com.example.pt.repository.UserRepositories;
import com.example.pt.service.UserLevelService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 用户等级更新定时任务
 * 定期自动更新所有用户的等级
 */
@Component
public class UserLevelUpdateTask {
    private static final Logger logger = LoggerFactory.getLogger(UserLevelUpdateTask.class);

    @Autowired
    private UserRepositories userRepository;

    @Autowired
    private UserLevelService userLevelService;

    /**
     * 每天凌晨3点自动更新所有用户等级
     * cron表达式：秒 分 时 日 月 星期
     */
    @Scheduled(cron = "0 0 3 * * *")
    public void updateAllUserLevels() {
        logger.info("开始执行用户等级自动更新任务");
        
        try {
            // 获取所有用户
            List<User> allUsers = userRepository.findAll();
            int totalUsers = allUsers.size();
            int updatedCount = 0;
            int errorCount = 0;
            
            logger.info("共找到 {} 个用户需要更新等级", totalUsers);
            
            // 遍历每个用户并更新等级
            for (User user : allUsers) {
                try {
                    int oldLevel = user.getLevel();
                    UserLevel newLevel = userLevelService.updateUserLevel(user.getUid());
                    
                    // 如果等级有变化，记录日志
                    if (oldLevel != newLevel.getId()) {
                        logger.info("用户 {} (ID: {}) 等级已更新: {} -> {}", 
                                user.getUsername(), user.getUid(), oldLevel, newLevel.getId());
                    }
                    
                    updatedCount++;
                } catch (Exception e) {
                    logger.error("更新用户 {} (ID: {}) 等级时发生错误: {}", 
                            user.getUsername(), user.getUid(), e.getMessage(), e);
                    errorCount++;
                }
            }
            
            logger.info("用户等级自动更新任务完成，总用户数: {}，成功更新: {}，失败: {}", 
                    totalUsers, updatedCount, errorCount);
        } catch (Exception e) {
            logger.error("执行用户等级自动更新任务时发生错误: {}", e.getMessage(), e);
        }
    }
} 